﻿namespace BDShop.Business.Helpers
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text.RegularExpressions;

    /// <summary>
    /// The product url helper.
    /// </summary>
    public class ProductUrlHelper
    {
        #region Public Methods and Operators

        public static string GetCategotyAlias(int categoryId)
        {
            string category = "category-alias";
            switch (categoryId)
            {
                case 53:
                    category = "an-uong";
                    break;
                case 52:
                    category = "du-lich";
                    break;
                case 56:
                case 69:
                    category = "thoi-trang";
                    break;
                case 54:
                    category = "lam-dep";
                    break;
                case 55:
                    category = "giai-tri-dao-tao";
                    break;
                case 57:
                    category = "gia-dung";
                    break;
                case 68:
                    category = "be-yeu";
                    break;
                case 59:
                    category = "cong-nghe";
                    break;
            }

            return category;
        }

        public static string GetProductTypeAlias(List<KeyValuePair<int, int>> productTypeIds)
        {
            var productTypes = new List<int>
                                   {
                                       10, 
                                       51,
                                       76, 
                                       81, 
                                       156, 
                                       165, 
                                       171, 
                                       179, 
                                       195, 
                                       201, 
                                       206, 
                                       211, 
                                       213, 
                                       221, 
                                       238, 
                                       232, 
                                       229,
                                       392,
                                       471,
                                       487
                                   };

            KeyValuePair<int, int> productTypeId =
                productTypeIds.Where(p => productTypes.Contains(p.Key)).OrderBy(p => p.Key).FirstOrDefault();

            string type = string.Empty;
            switch (productTypeId.Key)
            {
                case 10:
                    type = "nha-hang";
                    break;
                case 51:
                    type = "dao-tao";
                    break;
                case 76:
                    type = "thuc-pham";
                    break;
                case 81:
                    if (productTypeId.Value == 82)
                    {
                        type = "khach-san";
                    }
                    else if (productTypeId.Value == 84)
                    {
                        type = "tour-du-lich";
                    }

                    break;
                case 156:
                    type = "thoi-trang-nu";
                    break;
                case 165:
                    type = "thoi-trang-nam";
                    break;
                case 171:
                    type = "thoi-trang-tre-em";
                    break;
                case 179:
                    type = "phu-kien";
                    break;
                case 195:
                    type = "spa-suc-khoe";
                    break;
                case 201:
                    type = "my-pham";
                    break;
                case 206:
                    type = "vui-choi-hoc";
                    break;
                case 211:
                    type = "do-choi-sach-truyen";
                    break;
                case 213:
                    type = "nha-cua";
                    break;
                case 221:
                    type = "dien-gia-dung";
                    break;
                case 238:
                    type = "me-va-be";
                    break;
                case 232:
                    type = "phu-kien";
                    break;
                case 229:
                    type = "thiet-bi";
                    break;
                case 392:
                    type = "bo-suu-tap";
                    break;
                case 471:
                    type = "tour-nuoc-ngoai";
                    break;
                case 487:
                    type = "the-duc-tham-my";
                    break;
            }

            return type;
        }

        public static string GetCategotyNameCM(int categoryId)
        {
            string category = "category-name";
            switch (categoryId)
            {
                case 53:
                    category = "Nhà hàng - Ẩm thực";
                    break;
                case 52:
                    category = "Du lịch - Khách sạn";
                    break;
                case 56:
                case 69:
                    category = "Thời trang";
                    break;
                case 54:
                    category = "Sức khỏe & Làm đẹp";
                    break;
                case 55:
                    category = "Giải trí & Đào tạo";
                    break;
                case 57:
                    category = "Gia dụng - Nội thất";
                    break;
                case 68:
                    category = "Mẹ và Bé";
                    break;
                case 59:
                    category = "Điện tử - Công nghệ";
                    break;
            }

            return category;
        }

        public static string GetCategotyNameNM(int categoryId)
        {
            string category = "category-name";
            switch (categoryId)
            {
                case 53:
                    category = "Ăn uống";
                    break;
                case 52:
                    category = "Du lịch";
                    break;
                case 56:
                case 69:
                    category = "Thời trang";
                    break;
                case 54:
                    category = "Spa & Làm đẹp";
                    break;
                case 55:
                    category = "Giải trí & Đào tạo";
                    break;
                case 57:
                    category = "Gia dụng";
                    break;
                case 68:
                    category = "Mẹ & Bé";
                    break;
                case 59:
                    category = "Công nghệ";
                    break;
            }

            return category;
        }

        public static string GetProductTypeNameCM(List<KeyValuePair<int, int>> productTypeIds)
        {
            var productTypes = new List<int>
                                   {
                                       10, 
                                       51,
                                       76, 
                                       81, 
                                       156, 
                                       165, 
                                       171, 
                                       179, 
                                       195, 
                                       201, 
                                       206, 
                                       211, 
                                       213, 
                                       221, 
                                       238, 
                                       232, 
                                       229,
                                       392,
                                       471,
                                       487
                                   };

            KeyValuePair<int, int> productTypeId =
                productTypeIds.Where(p => productTypes.Contains(p.Key)).OrderBy(p => p.Key).FirstOrDefault();

            string type = string.Empty;
            switch (productTypeId.Key)
            {
                case 10:
                    type = "Nhà hàng - Quán ăn";
                    break;
                case 51:
                    type = "Đào tạo";
                    break;
                case 76:
                    type = "Thực phẩm";
                    break;
                case 81:
                    if (productTypeId.Value == 82)
                    {
                        type = "Khách sạn - Resorts";
                    }
                    else if (productTypeId.Value == 84)
                    {
                        type = "Tour du lịch";
                    }

                    break;
                case 156:
                    type = "Thời trang nữ";
                    break;
                case 165:
                    type = "Thời trang nam";
                    break;
                case 171:
                    type = "Thời trang trẻ em";
                    break;
                case 179:
                    type = "Phụ kiện thời trang";
                    break;
                case 195:
                    type = "Spa - Sức khỏe - Làm đẹp";
                    break;
                case 201:
                    type = "Mỹ phẩm - sản phẩm";
                    break;
                case 206:
                    type = "Giải trí - Vui chơi";
                    break;
                case 211:
                    type = "Đồ chơi - Sách truyện";
                    break;
                case 213:
                    type = "Nhà cửa - Đời sống";
                    break;
                case 221:
                    type = "Điện gia dụng";
                    break;
                case 238:
                    type = "Mẹ và bé";
                    break;
                case 232:
                    type = "Phụ kiện công nghệ";
                    break;
                case 229:
                    type = "Thiết bị điện tử";
                    break;
                case 392:
                    type = "Bộ sưu tập";
                    break;
                case 471:
                    type = "Tour nước ngoài";
                    break;
                case 487:
                    type = "Thể dục thẩm mỹ";
                    break;
            }

            return type;
        }

        public static string GetProductTypeNameNM(List<KeyValuePair<int, int>> productTypeIds)
        {
            var productTypes = new List<int>
                                   {
                                       10, 
                                       76, 
                                       81, 
                                       156, 
                                       165, 
                                       171, 
                                       179, 
                                       195, 
                                       201, 
                                       206, 
                                       211, 
                                       213, 
                                       221, 
                                       238, 
                                       232, 
                                       229,
                                       392
                                   };

            KeyValuePair<int, int> productTypeId =
                productTypeIds.Where(p => productTypes.Contains(p.Key)).OrderBy(p => p.Key).FirstOrDefault();

            string type = string.Empty;
            switch (productTypeId.Key)
            {
                case 10:
                    type = "Nhà hàng - Quán ăn";
                    break;
                case 76:
                    type = "Thực phẩm";
                    break;
                case 81:
                    if (productTypeId.Value == 82)
                    {
                        type = "Khách sạn - Resorts";
                    }
                    else if (productTypeId.Value == 84)
                    {
                        type = "Tour du lịch";
                    }

                    break;
                case 156:
                    type = "Thời trang nữ";
                    break;
                case 165:
                    type = "Thời trang nam";
                    break;
                case 171:
                    type = "Thời trang trẻ em";
                    break;
                case 179:
                    type = "Phụ kiện thời trang";
                    break;
                case 195:
                    type = "Spa - Sức khõe - Làm đẹp";
                    break;
                case 201:
                    type = "Mỹ phẩm - sản phẩm";
                    break;
                case 206:
                    type = "Giải trí - Chơi - Học";
                    break;
                case 211:
                    type = "Đồ chơi - Sách truyện";
                    break;
                case 213:
                    type = "Nhà cửa - Đời sống";
                    break;
                case 221:
                    type = "Điện gia dụng";
                    break;
                case 238:
                    type = "Mẹ và bé";
                    break;
                case 232:
                    type = "Phụ kiện công nghệ";
                    break;
                case 229:
                    type = "Thiết bị điện tử";
                    break;
                case 392:
                    type = "Bộ sưu tập";
                    break;
            }

            return type;
        }

        public static string GetCategoryUrl(string cityAlias, int categoryId, string pt, string f, string lf, string q, string mode)
        {
            string url = "/" + cityAlias;

            if (categoryId != 0)
            {
                url += "/" + GetCategotyAlias(categoryId);
                // nếu category không phải là du lịch
                if (categoryId != 52)
                {
                    if (!string.IsNullOrEmpty(pt))
                    {
                        int parentTypeId = int.Parse(pt.Split('_')[1]);
                        var keyValuePairs = new List<KeyValuePair<int, int>> { new KeyValuePair<int, int>(parentTypeId, 0) };
                        url += "/" + GetProductTypeAlias(keyValuePairs);
                    }
                }
                else
                {
                    if (!string.IsNullOrEmpty(f))
                    {
                        var keyValuePairs =
                            GetProductTypeFilter(string.IsNullOrEmpty(f) ? null : f.Trim().ToLower());
                        url += "/" + GetProductTypeAlias(keyValuePairs);
                    }
                }

                // giử lại các parameter
                if (!string.IsNullOrEmpty(f))
                {
                    url += "?f=" + f;
                }

                if (!string.IsNullOrEmpty(lf))
                {
                    if (url.IndexOf("?", StringComparison.Ordinal) == -1)
                    {
                        url += "?lf=" + lf;
                    }
                    else
                    {
                        url += "&lf=" + lf;
                    }
                }

                if (!string.IsNullOrEmpty(q))
                {
                    if (url.IndexOf("?", StringComparison.Ordinal) == -1)
                    {
                        url += "?q=" + q;
                    }
                    else
                    {
                        url += "&q=" + q;
                    }
                }

                if (!string.IsNullOrEmpty(mode))
                {
                    if (url.IndexOf("?", StringComparison.Ordinal) == -1)
                    {
                        url += "?mode=" + mode;
                    }
                    else
                    {
                        url += "&mode=" + mode;
                    }
                }
            }

            return url;
        }

        public static List<KeyValuePair<int, int>> GetProductTypeFilter(string f)
        {
            List<KeyValuePair<int, int>> productTypes = new List<KeyValuePair<int, int>>();
            if (f == null) return productTypes;
            foreach (string filterGroup in f.Split('/'))
            {
                if (filterGroup.Split(':').Length > 1)
                {
                    string groupName = filterGroup.Split(':')[0];
                    string groupValue = filterGroup.Split(':')[1];
                    if (Regex.IsMatch(groupName, @"producttype_\d+$"))
                    {
                        string idGroupString = Regex.Match(groupName, @"producttype_(?<id>\d+)$").Groups["id"].Value;
                        int id = int.Parse(idGroupString);
                        foreach (string facet in groupValue.Split('|'))
                        {
                            if (Regex.IsMatch(facet, @"-\d+$"))
                            {
                                string idString = Regex.Match(facet, @"-(?<id>\d+)$").Groups["id"].Value;
                                int typeId = int.Parse(idString);
                                productTypes.Add(new KeyValuePair<int, int>(id, typeId));
                            }
                        }
                    }
                }
            }
            return productTypes;
        }

        #endregion
    }
}